home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 51 / Amiga Format CD51 (2000-03-10)(Future Publishing)(GB)[!][issue 2000-04].iso / -in_the_mag- / workbench / term_4.8 / extras / source / term-source.lha / PhoneList.c < prev    next >
C/C++ Source or Header  |  1997-03-11  |  4KB  |  217 lines

  1. /*
  2. **    PhoneList.c
  3. **
  4. **    Phonebook list support routines
  5. **
  6. **    Copyright © 1990-1997 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. **
  9. **    :ts=4
  10. */
  11.  
  12. #ifndef _GLOBAL_H
  13. #include "Global.h"
  14. #endif
  15.  
  16. struct List *
  17. CreateRegularPhoneList(PhonebookHandle *PhoneHandle)
  18. {
  19.     struct List *LocalList;
  20.  
  21.     if(LocalList = CreateList())
  22.     {
  23.         if(PhoneHandle->Phonebook && PhoneHandle->NumPhoneEntries > 0)
  24.         {
  25.             PhoneEntry **Phonebook;
  26.             PhoneNode *Node;
  27.             LONG i;
  28.  
  29.             Phonebook = PhoneHandle->Phonebook;
  30.  
  31.             for(i = 0 ; i < PhoneHandle->NumPhoneEntries ; i++)
  32.             {
  33.                 if(Node = CreatePhoneNode(Phonebook[i],FALSE))
  34.                 {
  35.                     LimitedStrcpy(sizeof(Node->LocalName),Node->LocalName,Phonebook[i]->Header->Name);
  36.  
  37.                     AddTail(LocalList,(struct Node *)Node);
  38.                 }
  39.                 else
  40.                 {
  41.                     DeleteList(LocalList);
  42.  
  43.                     return(NULL);
  44.                 }
  45.             }
  46.         }
  47.     }
  48.  
  49.     return(LocalList);
  50. }
  51.  
  52. PhoneNode *
  53. CreatePhoneNode(PhoneEntry *Entry,BOOL InitName)
  54. {
  55.     if(Entry)
  56.     {
  57.         PhoneNode *Node;
  58.  
  59.         if(Node = (PhoneNode *)AllocVecPooled(sizeof(PhoneNode),MEMF_ANY|MEMF_CLEAR))
  60.         {
  61.                 /* Set up the node name */
  62.  
  63.             Node->Node.ln_Name = Node->LocalName;
  64.  
  65.             if(InitName)
  66.                 LimitedSPrintf(sizeof(Node->LocalName),Node->LocalName,"      %s",Entry->Header->Name);
  67.  
  68.                 /* Install the back link */
  69.  
  70.             Node->Entry = Entry;
  71.  
  72.             return(Node);
  73.         }
  74.     }
  75.  
  76.     return(NULL);
  77. }
  78.  
  79. VOID
  80. UpdatePhoneNode(PhoneNode *Node)
  81. {
  82.     if(Node)
  83.     {
  84.         PhoneEntry *Entry = Node->Entry;
  85.  
  86.         if(Entry->Count < 0)
  87.             LimitedSPrintf(sizeof(Node->LocalName),Node->LocalName,"      %s",Entry->Header->Name);
  88.         else
  89.             LimitedSPrintf(sizeof(Node->LocalName),Node->LocalName,"%3ld - %s",1 + Entry->Count,Entry->Header->Name);
  90.  
  91.             /* Update the group node as well */
  92.  
  93.         if(Entry->GroupNode)
  94.             LimitedStrcpy(sizeof(Entry->GroupNode->LocalName),Entry->GroupNode->LocalName,Node->LocalName);
  95.     }
  96. }
  97.  
  98. VOID
  99. UpdatePhoneList(PhonebookHandle *PhoneHandle)
  100. {
  101.     if(PhoneHandle->PhoneList)
  102.     {
  103.         PhoneNode *Node;
  104.  
  105.         for(Node = (PhoneNode *)PhoneHandle->PhoneList->lh_Head ; Node->Node.ln_Succ ; Node = (PhoneNode *)Node->Node.ln_Succ)
  106.             UpdatePhoneNode(Node);
  107.     }
  108. }
  109.  
  110. BOOL
  111. InitPhoneList(PhonebookHandle *PhoneHandle)
  112. {
  113.     struct List *LocalList;
  114.  
  115.         /* Create the list */
  116.  
  117.     if(LocalList = CreateList())
  118.     {
  119.             /* Do we have a list to fill? */
  120.  
  121.         if(PhoneHandle->Phonebook && PhoneHandle->NumPhoneEntries)
  122.         {
  123.             PhoneEntry **Phonebook;
  124.             PhoneNode *Node;
  125.             LONG i;
  126.  
  127.             Phonebook = PhoneHandle->Phonebook;
  128.  
  129.                 /* Create a node for every phonebook entry */
  130.  
  131.             for(i = 0 ; i < PhoneHandle->NumPhoneEntries ; i++)
  132.             {
  133.                 if(Node = CreatePhoneNode(Phonebook[i],FALSE))
  134.                     AddTail(LocalList,(struct Node *)Node);
  135.                 else
  136.                 {
  137.                     DeleteList(LocalList);
  138.  
  139.                     return(FALSE);
  140.                 }
  141.             }
  142.  
  143.                 /* Discard the old list if any */
  144.  
  145.             DeleteList(PhoneHandle->PhoneList);
  146.  
  147.                 /* Now initialize the nodes */
  148.  
  149.             for(Node = (PhoneNode *)LocalList->lh_Head ; Node->Node.ln_Succ ; Node = (PhoneNode *)Node->Node.ln_Succ)
  150.             {
  151.                     /* Initialize the back link */
  152.  
  153.                 Node->Entry->Node = Node;
  154.  
  155.                     /* Update its name. */
  156.  
  157.                 UpdatePhoneNode(Node);
  158.             }
  159.  
  160.             PhoneHandle->PhoneList = LocalList;
  161.  
  162.             return(TRUE);
  163.         }
  164.         else
  165.         {
  166.             DeleteList(PhoneHandle->PhoneList);
  167.             PhoneHandle->PhoneList = LocalList;
  168.  
  169.             return(TRUE);
  170.         }
  171.     }
  172.  
  173.     return(FALSE);
  174. }
  175.  
  176. VOID
  177. DeletePhoneList(PhonebookHandle *PhoneHandle)
  178. {
  179.     if(PhoneHandle->PhoneList)
  180.     {
  181.         PhoneNode *Node;
  182.  
  183.         for(Node = (PhoneNode *)PhoneHandle->PhoneList->lh_Head ; Node->Node.ln_Succ ; Node = (PhoneNode *)Node->Node.ln_Succ)
  184.         {
  185.             if(Node->Entry->Node == Node)
  186.                 Node->Entry->Node = NULL;
  187.         }
  188.  
  189.         DeleteList(PhoneHandle->PhoneList);
  190.         PhoneHandle->PhoneList = NULL;
  191.     }
  192. }
  193.  
  194.     /* SortPhoneEntries():
  195.      *
  196.      *    Sorts the current phone list array in ascending order.
  197.      */
  198.  
  199. VOID
  200. SortPhoneList(PhonebookHandle *PhoneHandle,LONG How,BOOL ReverseOrder)
  201. {
  202.     if(PhoneHandle->NumPhoneEntries > 1 && PhoneHandle->PhoneList)
  203.     {
  204.         PhoneEntry **Phonebook;
  205.         LONG i;
  206.  
  207.         qsort(PhoneHandle->Phonebook,PhoneHandle->NumPhoneEntries,sizeof(PhoneEntry *),GetSortFunc(How,ReverseOrder));
  208.  
  209.         Phonebook = PhoneHandle->Phonebook;
  210.  
  211.         NewList(PhoneHandle->PhoneList);
  212.  
  213.         for(i = 0 ; i < PhoneHandle->NumPhoneEntries ; i++)
  214.             AddTail(PhoneHandle->PhoneList,(struct Node *)Phonebook[i]->Node);
  215.     }
  216. }
  217.